package com.luo.dt.seata.tcc.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.luo.dt.common.model.result.RespResult;
import com.luo.dt.seata.tcc.model.dto.CreateOrderDto;
import com.luo.dt.seata.tcc.model.entity.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * 订单信息 服务类<br/>
 * 注：在Tcc接口上标注@LocalTcc注解
 *
 * @author luohq
 * @date 2022-12-12
 */
@LocalTCC
public interface IOrderService extends IService<Order> {

    /**
     * 创建订单（用户扣款、创建订单）
     *
     * @param createOrderDto 创建订单参数
     * @return 响应结果
     */
    @TwoPhaseBusinessAction(
            //该tcc的bean名称,写方法名便可，全局唯一
            name = "create",
            //二阶段确认方法
            commitMethod = "commitCreate",
            //二阶段取消方法
            rollbackMethod = "cancelCreate",
            //启用tcc防护（避免幂等、空回滚、悬挂）
            useTCCFence = true
    )
    RespResult create(@BusinessActionContextParameter("createOrderDto") CreateOrderDto createOrderDto);

    /**
     * 确认方法，与@TwoPhaseBusinessAction.commitMethod对应
     * 注：context可以传递try方法的参数
     *
     * @param context 上下文
     * @return 是否成功
     */
    Boolean commitCreate(BusinessActionContext context);

    /**
     * 回滚方法，与@TwoPhaseBusinessAction.rollbackMethod对应
     * 注：context可以传递try方法的参数
     *
     * @param context 上下文
     * @return 是否成功
     */
    Boolean cancelCreate(BusinessActionContext context);

}
